package com.wei.czz.framework.blog.controller;

import com.alibaba.fastjson2.JSON;
import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.comment.CommentDto;
import com.wei.czz.common.enums.ResultEnum;
import com.wei.czz.common.enums.blog.comment.CommentEnum;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.BlogCommentVo;
import com.wei.czz.common.vo.blog.comment.CommentFormVo;
import com.wei.czz.framework.blog.manager.BlogCommentManager;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-03-14 15:16:36
 * className: CommentManageController 博客评论管理请求操作接口
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("comment/manage")
@AllArgsConstructor
public class CommentManageController {

    private static final Logger log = LoggerFactory.getLogger(CommentManageController.class);

    private final BatchProperty batchProperty;

    private final BlogCommentManager blogCommentManager;

    /**
     * 保存博客作者评论博客信息接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面-博客评论弹出框调用
     * <p>
     * 此接口会校验是否重复提交
     * @param commentVo 博客评论信息请求参数对象
     * @return 保存结果
     */
    @Resubmit(message = "保存评论")
    @PostMapping("/save")
    @Auth(permit = "blog:comment:operation")
    public Result<Object> saveComment(@RequestBody BlogCommentVo commentVo) {
        log.info("开始保存博客作者评论博客信息业务。{}", commentVo);

        if (Objects.isNull(commentVo.getBlogId()) || StringUtils.isBlank(commentVo.getContent())
            || commentVo.getAuthorLike() == null || commentVo.getTopFlag() == null
            || !CommentEnum.isAuthorLikeValue(commentVo.getAuthorLike())
            || !CommentEnum.isTopFlagValue(commentVo.getTopFlag())) {
            log.info("保存博客作者评论博客信息接口请求参数错误");
            return Result.paramFail();
        }
        if (Objects.nonNull(commentVo.getParentCommentId())) {
            if (Objects.isNull(commentVo.getParentUserId())) {
                log.info("保存博客作者评论博客信息接口，被回复用户id参数错误");
                return Result.paramFail();
            }
        }

        blogCommentManager.saveComment(commentVo);

        log.info("保存博客作者评论博客信息业务结束");
        return Result.success();
    }

    /**
     * 分页查询博客评论列表接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面调用
     * @param commentFormVo 博客评论请求表单对象
     * @return 接口结果
     */
    @PostMapping("/list")
    @Auth(permit = "blog:comment:list")
    public Result<PageDto<CommentDto>> getCommentList(@RequestBody CommentFormVo commentFormVo) {
        log.info("开始分页查询博客评论列表业务。{}", commentFormVo);

        if (Objects.isNull(commentFormVo.getBlogId())) {
            log.info("分页查询博客评论列表接口请求参数错误");
            return Result.paramFail();
        }
        if (commentFormVo.getPage() == null || commentFormVo.getLimit() == null || StringUtils.isBlank(commentFormVo.getField())
            || StringUtils.isBlank(commentFormVo.getOrder())) {
            log.info("分页查询博客评论列表接口分页参数错误");
            return Result.pageFail();
        }

        PageDto<CommentDto> page = blogCommentManager.getCommentList(commentFormVo);

        log.info("分页查询博客评论列表业务结束");
        return Result.success(page);
    }

    /**
     * 用户查询博客评论详细信息接口
     * 根据博客评论主键值，获取博客评论关联的 用户名称、被回复用户名称和被回复的评论内容 三个属性值
     *
     * 调用方：
     *  1、浏览器-后台管理-博客评论管理页面-博客评论详细信息弹出框调用
     * @param commentId 博客评论主键
     * @return 博客评论信息
     */
    @GetMapping("/info")
    @Auth(permit = "blog:comment:list")
    public Result<CommentDto> getCommentInfo(@RequestParam("commentId") Long commentId) {
        log.info("开始用户查询博客评论详细信息业务。commentId={}", commentId);

        CommentDto commentDto = blogCommentManager.getCommentInfo(commentId);

        log.info("用户查询博客评论详细信息业务结束");
        return Result.success(commentDto);
    }

    /**
     * 博客评论自选导出接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面-博客评论导出弹出框调用
     * @param taskId   导出任务主键
     * @param response http响应对象
     * @return 结果
     */
    @GetMapping("/choice-export")
    @Auth(permit = "blog:comment:list")
    public Result<Object> blogCommentChoiceExport(@RequestParam("taskId") Long taskId, HttpServletResponse response) {
        log.info("开始博客评论自选导出业务。taskId={}", taskId);

        blogCommentManager.blogCommentChoiceExport(taskId, response);

        log.info("博客评论自选导出业务结束");
        return null;
    }

    /**
     * 用户点赞/取消点赞博客评论接口
     *
     * 调用方：
     *  1、浏览器-博客详细页面调用
     *  2、浏览器-后台管理页面-博客评论管理页面调用
     *  3、浏览器-后台管理页面-博客评论管理页面-博客评论弹出框调用
     *
     * 此接口会校验是否重复提交
     * @param commentFormVo 博客评论请求表单对象
     * @return 修改结果
     */
    @Resubmit(message = "更新博客评论‘点赞’数")
    @PostMapping("/update/like")
    @Auth(permit = "blog:comment:operation")
    public Result<Object> updateCommentLike(@RequestBody CommentFormVo commentFormVo) {
        log.info("开始用户点赞/取消点赞博客评论业务。{}", commentFormVo);

        if (Objects.isNull(commentFormVo.getBlogId()) || Objects.isNull(commentFormVo.getCommentId())
            || commentFormVo.getType() == null) {
            log.info("用户点赞/取消点赞博客评论接口请求参数错误");
            return Result.paramFail();
        }

        blogCommentManager.updateCommentLike(commentFormVo);

        log.info("用户点赞/取消点赞博客评论业务结束");
        return Result.success();
    }

    /**
     * 用户置顶/取消置顶博客评论接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面调用
     *  2、浏览器-后台管理页面-博客评论管理页面-博客评论弹出框调用
     *
     * 此接口会校验是否重复提交
     * @param commentFormVo 博客评论请求表单对象
     * @return 修改结果
     */
    @Resubmit(message = "更新博客评论‘置顶’状态")
    @PostMapping("/update/topFlag")
    @Auth(permit = "blog:comment:operation")
    public Result<Object> updateCommentTopFlag(@RequestBody CommentFormVo commentFormVo) {
        log.info("开始用户置顶/取消置顶博客评论业务。{}", commentFormVo);

        if (Objects.isNull(commentFormVo.getCommentId()) || commentFormVo.getTopFlag() == null
            || !CommentEnum.isTopFlagValue(commentFormVo.getTopFlag())) {
            log.info("用户置顶/取消置顶博客评论接口请求参数错误");
            return Result.paramFail();
        }

        blogCommentManager.updateCommentTopFlag(commentFormVo);

        log.info("用户置顶/取消置顶博客评论业务结束");
        return Result.success();
    }

    /**
     * 用户隐藏/取消隐藏博客评论接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面调用
     *  2、浏览器-后台管理页面-博客评论管理页面-博客评论弹出框调用
     *
     * 此接口会校验是否重复提交
     * @param commentFormVo 博客评论请求表单对象
     * @return 修改结果
     */
    @Resubmit(message = "更新评论‘隐藏’状态")
    @PostMapping("/update/hideFlag")
    @Auth(permit = "blog:comment:operation")
    public Result<Object> updateCommentHideFlag(@RequestBody CommentFormVo commentFormVo) {
        log.info("开始用户隐藏/取消隐藏博客评论业务。{}", commentFormVo);

        if (Objects.isNull(commentFormVo.getCommentId()) || commentFormVo.getHideFlag() == null
            || !CommentEnum.isHideFlagValue(commentFormVo.getHideFlag())) {
            log.info("用户隐藏/取消隐藏博客评论接口请求参数错误");
            return Result.paramFail();
        }

        blogCommentManager.updateCommentHideFlag(commentFormVo);

        log.info("用户隐藏/取消隐藏博客评论业务结束");
        return Result.success();
    }

    /**
     * 用户批量隐藏/取消隐藏博客评论接口
     *
     * 调用方：
     *  1、浏览器-后台管理页面-博客评论管理页面调用
     *
     * 此接口会校验是否重复提交
     * @param commentFormVo 博客评论请求表单对象
     * @return 修改结果
     */
    @Resubmit(message = "批量更新评论‘隐藏’状态")
    @PostMapping("/batchUpdate/hideFlag")
    @Auth(permit = "blog:comment:operation")
    public Result<Object> batchUpdateCommentHideFlag(@RequestBody Map<String, String> commentFormVo) {
        log.info("开始用户批量隐藏/取消隐藏博客评论业务。{}", commentFormVo);

        String commentIds = commentFormVo.get("commentIds");
        String sHideFlag = commentFormVo.get("hideFlag");

        if (StringUtils.isBlank(commentIds) || StringUtils.isBlank(sHideFlag)) {
            log.info("用户批量隐藏/取消隐藏博客评论接口请求参数错误");
            return Result.paramFail();
        }
        Integer hideFlag = Integer.parseInt(sHideFlag);
        if (!CommentEnum.isHideFlagValue(hideFlag)) {
            log.info("博客评论隐藏状态参数错误");
            return Result.paramFail();
        }
        List<Long> commentIdList = JSON.parseArray(commentIds, Long.class);
        if (commentIdList.isEmpty()) {
            log.info("博客评论id列表参数为空");
            return Result.getResult(ResultEnum.REQUEST_FAIL.getCode(),
                    "更新的博客评论列表为空，请确认，如有问题，请联系管理员处理");
        }
        if (commentIdList.size() > batchProperty.getMaxSize()) {
            log.warn("博客评论id列表参数超过最大允许值。batch.maxSize={} list.size={}", batchProperty.getMaxSize(),
                    commentIdList.size());
            return Result.getResult(ResultEnum.REQUEST_FAIL.getCode(),
                    "数据量过大，系统拒绝，请确认，如有问题，请联系管理员处理");
        }

        blogCommentManager.batchUpdateCommentHideFlag(commentIdList, hideFlag);

        log.info("用户批量隐藏/取消隐藏博客评论业务结束");
        return Result.success();
    }

}
